home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / telecomm / fnordadl / fn132src.zoo / citutil / rchange.c < prev    next >
C/C++ Source or Header  |  1991-09-02  |  4KB  |  192 lines

  1. /*
  2.  * rchange.c -- change the value of #maxrooms (the maximum number of room
  3.  *         slots available for use.
  4.  *
  5.  * 90May29 RH    Created as part of 1.3 release.
  6.  */
  7.  
  8. #include "ctdl.h"
  9. #include "log.h"
  10. #include "room.h"
  11. #include "config.h"
  12. #include "citlib.h"
  13.  
  14. char *program = "rchange";
  15. int newmaxrooms, maxused;
  16.  
  17. /* Get a yes/no response from console */
  18. int
  19. getyesno(void)
  20. {
  21.     int c;
  22.  
  23.     while (1) {
  24.     c = toupper(getch());
  25.     if (c == 'Y' || c == 'N')
  26.         break;
  27.     }
  28.     putchar(c);
  29.     putchar('\n');
  30.     if (c == 'N')
  31.     return NO;
  32.     else
  33.     return YES;
  34. }
  35.  
  36. /* If we are increasing the number of rooms, create the new room files */
  37. int
  38. addrooms(void)
  39. {
  40.     int i;
  41.  
  42.     if (newmaxrooms < MAXROOMS)
  43.     return NO;
  44.  
  45.     memset(&roomBuf, 0, RB_SIZE);
  46.     roomBuf.msg = (theMessages *) realloc(roomBuf.msg, MSG_BULK);
  47.     roomTab = (struct rTable *) realloc(roomTab, (sizeof *roomTab) *
  48.     newmaxrooms);
  49.     for (i = MAXROOMS; i < newmaxrooms; i++) {
  50.     printf("Creating new room %d\n", i);
  51.     thisRoom = i;    /* needed by noteRoom()! */
  52.     putRoom(i);
  53.     noteRoom();
  54.     }
  55.     return YES;
  56. }
  57.  
  58. /* If we are reducing the number of rooms, delete unneeded room files */
  59. int
  60. deleterooms(void)
  61. {
  62.     int i;
  63.     PATHBUF sysfile;
  64.     LABEL fn;
  65.  
  66.     for (i = newmaxrooms; i < MAXROOMS; i++) {
  67.     printf("Deleting unused room %d\n", i);
  68.     sprintf(fn, "room%04d.sys", i);
  69.     ctdlfile(sysfile, cfg.roomdir, fn);
  70.     if (dunlink(sysfile))
  71.         crashout("couldn't delete %s", sysfile);
  72.     }
  73.     return YES;
  74. }
  75.  
  76. /* In case we're reducing the number of rooms, scan those to be thrown out
  77.    to make sure they're empty. */
  78. int
  79. scanrooms(void)
  80. {
  81.     int i;
  82.  
  83.     if (newmaxrooms > MAXROOMS)
  84.     return NO;
  85.  
  86.     for (i = MAXROOMS - 1; !readbit(roomTab[i],INUSE); i--)
  87.     /* nothing */;
  88.     maxused = i + 1;
  89.     printf("Last roomslot in use is %d.\n", i);
  90.     if (maxused == MAXROOMS) {
  91.     printf("No compression possible.\n");
  92.     return NO;
  93.     }
  94.     if (maxused > newmaxrooms) {
  95.     printf("Error: desired size of %d cannot be achieved.\n", newmaxrooms);
  96.     printf("The best that can be done is %d; go ahead? (y/n) ", maxused);
  97.     if (!getyesno())
  98.         return NO;
  99.     else
  100.         newmaxrooms = maxused;
  101.     }
  102.     roomTab = (struct rTable *) realloc(roomTab, (sizeof *roomTab) *
  103.     newmaxrooms);
  104.     return deleterooms();
  105. }
  106.  
  107. void
  108. modifylogs(void)
  109. {
  110.     int i, oldlog, newlog, oldmaxrooms;
  111.     PATHBUF oldfile, newfile;
  112.  
  113.     ctdlfile(oldfile, cfg.sysdir, "ctdllog.sys");
  114.     if ((oldlog = dopen(oldfile, O_RDONLY)) < 0)
  115.     crashout("cannot open %s", oldfile);
  116.  
  117.     ctdlfile(newfile, cfg.sysdir, "ctdllog.tmp");
  118.     if ((newlog = dcreat(newfile)) < 0)
  119.     crashout("cannot create %s", newfile);
  120.  
  121.     oldmaxrooms = MAXROOMS;
  122.  
  123.     for (i = 0; i < cfg.logsize; i++) {
  124.     MAXROOMS = oldmaxrooms;
  125.     getlog(&logBuf, i, oldlog);
  126.     printf("Modifying log #%d", i);
  127.     if (readbit(logBuf, uINUSE))
  128.         printf(" (%s)", logBuf.lbname);
  129.     putchar('\n');
  130.     MAXROOMS = newmaxrooms;
  131.     logBuf.lbgen = (char *) realloc(logBuf.lbgen, GEN_BULK);
  132.     putlog(&logBuf, i, newlog);
  133.     }
  134.     MAXROOMS = oldmaxrooms;
  135.  
  136.     dclose(oldlog);
  137.     dclose(newlog);
  138.  
  139.     if (dunlink(oldfile))
  140.     crashout("cannot unlink %s", oldfile);
  141.     if (drename(newfile, oldfile))
  142.     crashout("cannot rename %s to %s", oldfile, newfile);
  143. }
  144.  
  145. main(int argc, char **argv)
  146. {
  147.     int p, junk;
  148.  
  149.     setbuf(stdout, NULL);
  150.  
  151.     printf("%s for Fnordadel V%s\n", program, VERSION);
  152.  
  153.     if (argc == 2)
  154.     newmaxrooms = atoi(argv[1]);
  155.     else {
  156.     fprintf(stderr, "usage: %s <new max number of rooms>\n", program);
  157.     if (fromdesk())
  158.         hitkey();
  159.     exit(1);
  160.     }
  161.  
  162.     if ((newmaxrooms > MAXMAXROOMS) || (newmaxrooms < MINMAXROOMS))
  163.     crashout("maxrooms must be between %d and %d", MINMAXROOMS,
  164.         MAXMAXROOMS);
  165.     else if (newmaxrooms > SANEMAXROOMS) {
  166.     printf("Do you really want %d rooms? (y/n) ", newmaxrooms);
  167.     if (!getyesno())
  168.         crashout("Okay");
  169.     }
  170.     else if (newmaxrooms == MAXROOMS)
  171.     crashout("maxrooms is already %d", newmaxrooms);
  172.  
  173.     if (readSysTab(FALSE) && makelock(&p)) {
  174.     initroomBuf(&roomBuf);
  175.     initlogBuf(&logBuf);
  176.  
  177.     if (addrooms() || scanrooms()) {     /* did we change anything? */
  178.         modifylogs();            /* resize logBuf.lbgen */
  179.         printf("Be sure to change ctdlcnfg.sys to reflect the new value of\n");
  180.         printf("maxrooms (%d).  Then run configur.  If you don't, your\n",
  181.         newmaxrooms);
  182.         printf("system will explode.\n"); 
  183.         MAXROOMS = newmaxrooms;
  184.         junk = writeSysTab();
  185.     }
  186.     wipelock(&p);
  187.     }
  188.     if (fromdesk())
  189.     hitkey();
  190.     exit(0);
  191. }
  192.